package com.xizi.locksupport;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.LockSupport;

// 通过park()和unpark(thread)方法来实现阻塞和唤醒线程的操作
public class LockSupportDemo {

    public static void main(String[] args) {
        Thread a = new Thread(() -> {
            // 先unpark() 再park()
            // 程序运行结果：因为引入了通行证的概念，所以先唤醒（unpark()）其实并不会有什么影响，
            // 从程序运行结果可以看出，A 线程执行 LockSupport.park() 时并没有被阻塞
//			try {
//				TimeUnit.SECONDS.sleep(2);
//			} catch (InterruptedException e) {
//				e.printStackTrace();
//			}
            System.out.println(Thread.currentThread().getName() + " come in. " + System.currentTimeMillis());
            // park有凭证就直接消耗掉这个凭证
            // 若没有凭证阻塞等待凭证
            LockSupport.park();
//			LockSupport.park();
            System.out.println(Thread.currentThread().getName() + " 唤醒. " + System.currentTimeMillis());
        }, "Thread A");
        a.start();

        Thread b = new Thread(() -> {
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            //unpark 许可证permit+1
            // 连续调用两次unpark和调用一次是一样的
            LockSupport.unpark(a);
            LockSupport.unpark(a);
            System.out.println(Thread.currentThread().getName() + " 通知. " + System.currentTimeMillis());
        }, "Thread B");
        b.start();
    }

}
